/*! \file InPerUsr.h
    \brief Interface do Modulo Percistencia Usuario.
 */

#ifndef PerUsr
#define PerUsr

#ifdef PerUsr_Serv
#define ExtPU
#else
#define ExtPU extern
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "InVetBit.h"

/*! \def ARQUIVO_PU
    \brief O nome do arquivo do Banco de dados usuario
    Arquivo : o Arquivo sera um arquivo de resgistros de tamanho fixo que tera as sequintes caracteristicas:\n
|campo 1= 11 digitos|campo 2= 15 digitos|campo 3= 4 digitos|campo 4= 1 digito|campo 5= 1 digito|campo 6=  1 digito\n

campo 1= chave primeria cpf.\n
campo 2= chave secundaria nome. \n
campo 3= senha.\n
campo 4= numero de tentativas erradas.\n
campo 5= numero de albums do usuario.\n
campo 6= Usuario Bloqueado.
    Details.
*/

/*! \def NARQUIVO_PU
    \brief A type definition for a .
*/

/*! \def TAMANHOREG_PU
    \brief A type definition for a .
*/

/*! \def VARIAVELCONTROLE_PU
    \brief A type definition for a .
*/

/*! \def EXTENCAO_PU
    \brief ------------------------.
*/

#define ARQUIVO_PU "Usuario.txt"
#define NARQUIVO_PU "Usuario"
#define TAMANHOREG_PU 38
#define VARIAVELCONTROLE_PU '$'
#define EXTENCAO_PU ".txt"

/**
   \struct usuario_M
   \brief Essa e a estrutura que classifica o usario no contexto modulo de persistencia usuario variaveis
 */
struct usuario_M {
    char Cpf[12]; /**< Um vetor de caracteres com 11 posicoes que quarda o cpf do usuario */
    char Nome[16]; /**< Um vetor de caracteres com 15 posicoes que quarda o nome do usuario*/
    char Senha[5]; /**< Um vetor de caracteres com 4 posicoes que quarda a senha do usuario*/
    int NumerAlbum; /**< um inteiro que quarda o numero de albuns que um usuario tem*/
};


/*! \var typedef struct usuario_M User
    \brief Representacao do usuario no contexto Modulo Percistencia Usuario
 */
typedef struct usuario_M User_PU;

/*! \fn ExtPU int VerificaSenha_PU (char* CpfPass, char* SenhaPass)
   \brief Verificar a senha de um certo usuario e permirtir autentica�ao do mesmo.
   \param cpf_Pass : o cpf do usuario a ser autenticado.
   \param senha_Pass : a senha digitada pelo usuario.
   \return Um int Diz o tipo de Erro ou o numero de tentativas:\n
      0 -  Se a senha esta correta\n
     -1 -  Erro de Banco de Dados\n
     -2 -  O Usuario nao existe\n
     -3 -  O Usuario esta bloqueado\n
     Po -  O Numero de tentativas consecutivas\n
 */
ExtPU int VerificaSenha_PU(const char*, const char*);

/*! \fn ExtPU int BloqueiaUsuario_PU (char* cpf_Pass)
    \brief Responsavel por bloquear um usuario passado.
    \param cpf_Pass : o cpf do usuario a ser bloqueado.
    \return Um int que funciona com "bool":\n
     0  = Sucesso.\n
    -1  = Erro de Arquivo.\n
*/
ExtPU int BloqueiaUsuario_PU(const char* cpf_Pass);

/*! \fn ExtPU int LiberaUsuario_PU (char* cpf_Pass)
    \brief Responsavel pela leberacao de um certo usuario
    \param cpf_Pass : o cpf do usuario a ser liberado.
    \return Um int que funciona com "bool":\n
     0  = Sucesso.\n
    -1  = Erro de Arquivo.\n
    -2  = Usuario nao encontrado.\n
*/
ExtPU int LiberaUsuario_PU(const char*);

/*! \fn ExtPU User* PegaUser_PU (char* cpf_Pass)
    \brief Responsavel por pegar usuario dado a cpf deste
    \param cpf_Pass : o cpf do usuario a ser retornado.
    \return Um int que funciona com "bool":\n
     0  = Sucesso.\n
    -1  = Erro de Arquivo.\n
    -2  = Usuario nao encontrado.\n
*/
ExtPU int PegaUser_PU(const char*, User_PU*);

/*! \fn ExtPU int AtualizaUser_PU (UserPU* DadosUsuar)
    \brief Responsavel por regravar os dados do usuario com os novos dados passados atraves da struct.
    \param DadosUsuar : Uma struct prechida com os novos dados do usuario.
    \return Um int que funciona com "bool":\n
     0  = Sucesso.\n
    -1  = Erro de Arquivo.\n
    -2  = Usuario nao encontrado.\n
*/
ExtPU int AtualizaUser_PU(User_PU*);

/*! \fn ExtPU int DeletaUser_PU (char* pc_cpf_Pass, char* pc_senha_Pass)
    \brief Responsavel por deletar o usuario do cpf passado por parametro.
    \param cpf_Pass : o cpf do usuario a ser deletado.
    \return Um int que funciona com "bool":\n
     0  = Sucesso.\n
    -1  = Erro de Arquivo.\n
    -2  = Usuario nao encontrado.\n
    OT  = Erro Vetor de Bits.\n
 */
ExtPU int DeletaUser_PU(const char*);

/*! \fn ExtPF int AddUsuario_PU (User_PU* NovoUsuar)
    \brief Responsavel por adionar um novo usuario ao Banco de Dados.
    \param NovoUsuar : uma struct que tem os dados do novo usuario.
    \return Um int que funciona com "bool":\n
     0  = Sucesso.\n
    -1  = Erro de Arquivo.\n
    -2  = Usuario ja existe.\n
    OT  = Erro Vetor de Bits.\n
 */
ExtPU int AddUsuario_PU(User_PU *);

/*! \fn ExtPF int AddAlbum_PU (char* cpf_Pass);
    \brief Responsavel por adionar um no numero de albuns pertencetes ao usuario.
    \param cpf_Pass O cpf do usuario cujo o valor de albuns deve ser incrementado.
    \return Um int que vem com o numero de albums ja incrementado:\n
    PO  = Numero de Albuns apos a adicao.\n
    -1  = Erro de Arquivo.\n
    -2  = Usuario nao encontrado.\n
 */
ExtPU int AddAlbum_PU(const char*);

/*! \fn ExtPF int RemovAlbum_PU (char* cpf_Pass);
    \brief Responsavel por remover um no numero de albuns pertencetes ao usuario
    \param cpf_Pass O cpf do usuario cujo o valor de albuns deve ser decrementado.
    \return Um int que vem com o numero de albums ja decrementado:\n
    PO  = Numero de albuns apos a remocao.\n
    -1  = Erro de Arquivo.\n
    -2  = Usuario nao encontrado.\n
 */
ExtPU int RemoveAlbum_PU(const char*);

/*! \fn ExtPU int ListaUsuariosBloqueados_PU(const char*);
    \brief Responsavel por pegar usuario dado a cpf deste
    \param cpf_Pass O cpf do usuario cujo o valor de albuns deve ser verificado.
    \return Um int que vem com o numero de albums ja incrementado:\n
    PO  = tamanho do proximo pulo\n
    -1  = Erro de Arquivo.\n
    -2  = nao ha mais Usuarios.\n
 */
int ListaBloqueados_PU (User_PU *Usuar, int Pulo);

/*! int VerificaNumeroAlbuns_PU (const char* CpfPass)
    \brief Responsavel por pegar usuario dado a cpf deste
    \param cpf_Pass O cpf do usuario cujo o valor de albuns deve ser verificado.
    \return Um int que vem com o numero de albums ja incrementado:\n
    PO  = Numero de albuns verificado.\n
    -1  = Erro de Arquivo.\n
    -2  = Usuario nao encontrado.\n
 */
int VerificaNumeroAlbuns_PU (const char* CpfPass);
#endif
